package com.hc.programming.tree;

import java.util.Arrays;

/**
 * 给出二叉 搜索 树的根节点，该树的节点值各不相同，请你将其转换为累加树（Greater Sum Tree），使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
 * 提醒一下，二叉搜索树满足下列约束条件：
 * * 节点的左子树仅包含键 小于 节点键的节点。
 * * 节点的右子树仅包含键 大于 节点键的节点。
 * * 左右子树也必须是二叉搜索树。
 * 注意：本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同
 * <p>
 * 示例 1：
 * <a href="./把二叉搜索树转换为累加树-示例1.png">示例1</a>
 * 输入：[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
 * 输出：[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]
 * 示例 2：
 * 输入：root = [0,null,1]
 * 输出：[1,null,1]
 * 示例 3：
 * 输入：root = [1,0,2]
 * 输出：[3,3,2]
 * 示例 4：
 * 输入：root = [3,2,4,1]
 * 输出：[7,9,4,10]
 * <p>
 * 提示：
 * 树中的节点数介于 0 和 10^4 之间。
 * 每个节点的值介于 -10^4 和 10^4 之间。
 * 树中的所有值 互不相同 。
 * 给定的树为二叉搜索树。
 *
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/10/18 11:42
 */
public class 把二叉搜索树转换为累加树 {
    public static void main(String[] args) {
        Integer[] arr = new Integer[]{4, 1, 6, 0, 2, 5, 7, null, null, null, 3, null, null, null, 8};
        TreeNode tree = TreeNode.tree(arr);
        System.out.println(Arrays.toString(arr) + "=,--" + convertBST(tree));
        arr = new Integer[]{0, null, 1};
        tree = TreeNode.tree(arr);
        System.out.println(Arrays.toString(arr) + "=,--" + convertBST(tree));
        arr = new Integer[]{1, 0, 2};
        tree = TreeNode.tree(arr);
        System.out.println(Arrays.toString(arr) + "=,--" + convertBST(tree));
        arr = new Integer[]{3, 2, 4, 1};
        tree = TreeNode.tree(arr);
        System.out.println(Arrays.toString(arr) + "=,--" + convertBST(tree));
    }


    public static TreeNode convertBST(TreeNode root) {
        preSum = 0;
        return 右中左递归(root);
    }

    private static int preSum = 0;
    private static TreeNode 右中左递归(TreeNode root) {
        if (root == null) return null;
        右中左递归(root.right);
        root.val += preSum;
        preSum = root.val;
        右中左递归(root.left);
        return root;
    }
}
